package socket;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import java.net.Socket;
import java.nio.charset.StandardCharsets;

public class ClientGUI extends JFrame {
    private JTextArea chatArea; // 聊天信息显示区域
    private JTextField inputField; // 输入框
    private JButton sendButton; // 发送按钮
    private Socket socket; // Socket对象
    private PrintWriter pw; // 输出流对象

    public ClientGUI() {
        setTitle("Chat Client"); // 设置窗口标题

        // 初始化聊天信息显示区域
        chatArea = new JTextArea();
        chatArea.setEditable(false); // 设置为不可编辑
        JScrollPane scrollPane = new JScrollPane(chatArea);
        add(scrollPane, BorderLayout.CENTER); // 将文本域添加到窗口中

        // 初始化输入框和发送按钮
        inputField = new JTextField();
        sendButton = new JButton("发送");
        JPanel inputPanel = new JPanel(new BorderLayout());
        inputPanel.add(inputField, BorderLayout.CENTER);
        inputPanel.add(sendButton, BorderLayout.EAST);
        add(inputPanel, BorderLayout.SOUTH);

        // 发送按钮的点击事件监听器
        sendButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String message = inputField.getText(); // 获取输入框中的内容
                sendMessage(message); // 调用发送消息的方法
                inputField.setText(""); // 清空输入框
            }
        });

        setSize(400, 300); // 设置窗口大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置关闭窗口时默认操作
        setVisible(true); // 显示窗口

        connect(); // 调用连接服务器的方法
        start(); // 调用客户端开始工作的方法
    }

    /**
     * 连接服务器的方法
     */
    private void connect() {
        try {
            System.out.println("正在链接服务端...");
            socket = new Socket("localhost", 8088);
            System.out.println("与服务端建立链接!");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 客户端开始工作的方法
     */
    private void start() {
        try {
            OutputStream out = socket.getOutputStream();
            OutputStreamWriter osw = new OutputStreamWriter(out, StandardCharsets.UTF_8);
            BufferedWriter bw = new BufferedWriter(osw);
            pw = new PrintWriter(bw, true);

            // 启动用于读取服务器消息的线程
            ServerHandler handler = new ServerHandler();
            Thread t = new Thread(handler);
            t.setDaemon(true);
            t.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 发送消息的方法
     * @param message 要发送的消息
     */
    private void sendMessage(String message) {
        pw.println(message); // 将消息写入输出流
    }

    /**
     * 用于读取来自服务端发送回来的消息的线程
     */
    private class ServerHandler implements Runnable {
        public void run() {
            try {
                InputStream in = socket.getInputStream();
                InputStreamReader isr = new InputStreamReader(in, StandardCharsets.UTF_8);
                BufferedReader br = new BufferedReader(isr);
                String message;
                while ((message = br.readLine()) != null) {
                    chatArea.append(message + "\n"); // 将来自服务器的消息追加到聊天信息显示区域
                    chatArea.setCaretPosition(chatArea.getDocument().getLength()); // 滚动条自动到底部
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        new ClientGUI();
    }
}